package chan.module.project.comm;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.sql.*;

public class ConnectionCommonUtil {


    public static void out(InputStream inputStream) throws Exception {
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        byte[] buffer = new byte[8192]; // 8KB 缓冲区
        int bytesRead;
        while ((bytesRead = bis.read(buffer)) != -1) {
            System.out.write(buffer, 0, bytesRead); // 按字节块写入 System.out
        }
    }


    public static Connection getConn(String driverName, String url, String user, String password) {
        Connection conn = null;
        try {
            Class.forName(driverName);
            // 2. 建立连接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功！");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void queryMeta(Connection connection, String sql) {
        try {
            // 3. 执行查询
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(sql);  // [[12], [16]]

            // 假设已获取ResultSet对象 rs
            ResultSetMetaData metaData = rs.getMetaData();

            // 获取列数量
            int columnCount = metaData.getColumnCount();
            System.out.println("结果集包含 " + columnCount + " 列");

            System.out.println("\n列详细信息：");
            System.out.println("========================================================================");

            // 遍历每一列输出属性（注意列索引从1开始）
            for (int i = 1; i <= columnCount; i++) {
                // 获取列名（注意：可能是表的原始列名或AS别名，取决于SQL语句）
                String columnName = metaData.getColumnName(i);       // 数据库原始列名
                String columnLabel = metaData.getColumnLabel(i);     // 查询结果中的列标签（可能含AS别名）

                int precision = metaData.getPrecision(i);
                int scale = metaData.getScale(i);

                // 获取数据类型信息
                String typeName = metaData.getColumnTypeName(i);     // 数据库类型名称（如VARCHAR, INT）
                int type = metaData.getColumnType(i);                // JDBC类型代码（对应java.sql.Types中的值）
                String className = metaData.getColumnClassName(i);   // Java类全名（如java.lang.String）

                // 其他属性
                int displaySize = metaData.getColumnDisplaySize(i);  // 列的最大显示宽度（字符数）
                boolean autoIncrement = metaData.isAutoIncrement(i); // 是否自增列
                int nullable = metaData.isNullable(i);               // 是否允许NULL值

                // 将可空属性转换为可读文本
                // JDK8兼容的switch语法
                String nullableStatus;
                switch (nullable) {
                    case ResultSetMetaData.columnNoNulls:
                        nullableStatus = "不允许NULL";
                        break;
                    case ResultSetMetaData.columnNullable:
                        nullableStatus = "允许NULL";
                        break;
                    default:
                        nullableStatus = "未知";
                        break;
                }

                // 格式化输出
                System.out.printf("列 %d:\n", i);
                System.out.printf("  原始列名: %-15s 显示标签: %-15s\n", columnName, columnLabel);
                System.out.printf("  类型名称: %-8s (JDBC类型码: %-4d) → Java类: %s\n", typeName, type, className);
                System.out.printf("  显示宽度: %-4d 自增: %-5s 可空性: %s\n",
                        displaySize, autoIncrement ? "是" : "否", nullableStatus);
                System.out.printf("  精度: %s 宽度: %s\n", precision, scale);
                System.out.println("------------------------------------------------------------------------");
            }
            // 5. 关闭资源
            close(rs, stmt, connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception ignored) {
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception ignored) {
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (Exception ignored) {
            }
        }
    }
}
